﻿/**
 *
 * @file   FITKCCXAdaptorSurface.h
 * @brief  Calculix Part 适配器 用于解析INP文件中的Surface
 * @author XuChao (xxu715737@163.com)
 * @date   2024-05-27
 *
 */
#ifndef FITKCCXADAPTORSURFACE_H
#define FITKCCXADAPTORSURFACE_H

#include "FITKCCXAbstractAdaptor.h"
#include "FITKCCXModelInforManager.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

 // 前置声明
ForwardDeclarNS(Interface, FITKMeshSurface)
ForwardDeclarNS(Interface, FITKMeshSurfaceElement)
ForwardDeclarNS(Interface, FITKMeshSurfaceNode)
ForwardDeclarNS(Interface, FITKComponentManager)
ForwardDeclarNS(Interface, FITKAbaAssembly)
ForwardDeclarNS(AbaqusData, FITKAbaqusPartManager)
ForwardDeclarNS(AbaqusData, FITKDataCase)

namespace IO
{
    class FITKCCXAdaptorSurface : public FITKCCXAbstractAdaptor
    {
    public:
        explicit FITKCCXAdaptorSurface() = default;
        ~FITKCCXAdaptorSurface() = default;

        /**
        * @brief  获取适配器数据类型名
        * @return 适配器数据类型名
        * @author XuChao (xxu715737@163.com)
        * @date   2024-05-27
        */
        QString getAdaptorClass() override;

        /**
         * @brief  适配器读取
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        bool adaptR() override;

        /**
         * @brief  适配器写出
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        bool adaptW() override;

        /**
         * @brief 设置set管理
         * @param manager 管理器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        void setSetSurfManaget(Interface::FITKComponentManager* manager);

        /**
        * @brief 设置Assembly管理器和part管理器
        * @param ass Assembly管理器
        * @param part part管理器
        * @author XuChao (xxu715737@163.com)
        * @date   2024-05-27
        */
        void setAssemblyPartManager(Interface::FITKAbaAssembly* ass, AbaqusData::FITKAbaqusPartManager* part);

        /**
         * @brief  设置表面累加器的值
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        void setSurfaceNumber(const int &surfaceNumber);

        /**
         * @brief  获取表面累加器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        int getSurfaceNumber();

        /**
         * @brief  设置abaqus与calculix中的映射关系
         * @param  modelInfoManager
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        void setModelInfoManager(FITKCCXModelInforManager* modelInfoManager);

        /**
         * @brief  设置表面映射键中的父节点
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        void setMappingKeyDataObjectID(const int& mappingDataObectID);

    private:
        /**
         * @brief  写出单元集合（elemenet）类型的表面
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeElementTypeSurface();

        /**
         * @brief  写出节点集合类型的表面
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        bool writeNodeTypeSurface();

        /**
         * @brief  根据instance的名称获取Instance的ID值
         * @param  inputInstanceName  instance的名称
         * @return
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-31
         */
        int getInstanceIDByName(const QString &inputInstanceName);

        /** 
         * @brief  壳单元表面字段映射 
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-04
         */
        QString shellSurfaceMapValue(const QString& inputValue);

    private:
        /**
         * @brief 设置set管理
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        Interface::FITKComponentManager* _setSurfManager{};

        /**
        * @brief Assembly管理器
        * @author XuChao (xxu715737@163.com)
        * @date   2024-05-27
        */

        Interface::FITKAbaAssembly* _assemblyManager{};
        /**
         * @brief part管理器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-27
         */
        AbaqusData::FITKAbaqusPartManager* _partManager{};

        /**
         * @brief  abaqus与calculix映射关系表
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        FITKCCXModelInforManager *_modelInfoManager{};

        /**
         * @brief  表面编码累加器
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-30
         */
        int _surfaceNumber = 0;

        /** 
         * @brief  映射主键父节点ID 
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-04
         */
        int _mappingKeyDataObjectID = 0;
    };
    Register2FITKIOAdaptorFactory(CCXINP, Interface::FITKMeshSurface, FITKCCXAdaptorSurface, 1)
        Register2FITKIOAdaptorFactory(CCXINP, Interface::FITKMeshSurfaceElement, FITKCCXAdaptorSurface, 2)
        Register2FITKIOAdaptorFactory(CCXINP, Interface::FITKMeshSurfaceNode, FITKCCXAdaptorSurface, 3)
};
#endif // !FITKCCXADAPTORSURFACE_H